package com.evan.review.fragment;

/**
 * Fragment生命周期详解及面试要点
 *
 * 一、基础生命周期方法
 *
 * 1. onAttach()
 *    - 作用：Fragment与Activity关联时调用
 *    - 执行时机：Fragment被添加到Activity时，在所有生命周期方法之前调用
 *    - 常见操作：获取Activity引用，初始化与Activity的通信
 *    - 注意事项：此时可以通过getActivity()获取宿主Activity
 *
 * 2. onCreate()
 *    - 作用：Fragment被创建时调用
 *    - 执行时机：onAttach()之后，UI创建之前
 *    - 常见操作：初始化Fragment的非UI组件，如变量、数据等
 *    - 注意事项：此时不能操作UI，因为视图尚未创建
 *
 * 3. onCreateView()
 *    - 作用：创建Fragment的视图
 *    - 执行时机：onCreate()之后
 *    - 常见操作：加载布局(inflate)，创建视图层次结构
 *    - 注意事项：必须返回Fragment的根视图，如不需UI可返回null
 *
 * 4. onViewCreated()
 *    - 作用：视图创建完成后调用
 *    - 执行时机：onCreateView()返回后立即调用
 *    - 常见操作：查找视图、设置监听器、初始化UI组件
 *    - 注意事项：比onCreateView()更适合进行UI初始化操作
 * 
 * 5. onActivityCreated() (已弃用，推荐在onViewCreated中处理)
 *    - 作用：当宿主Activity的onCreate()方法完成后调用
 *    - 执行时机：onViewCreated()之后
 *    - 常见操作：访问Activity中的视图，获取Activity完成初始化后的数据
 *    - 注意事项：Android官方已弃用此方法，建议在onViewCreated中完成相关操作
 * 
 * 6. onStart()
 *    - 作用：Fragment变为可见时调用
 *    - 执行时机：onViewCreated()之后，或从停止状态恢复
 *    - 常见操作：类似Activity的onStart()
 *    - 注意事项：此时Fragment可见但不一定可交互
 * 
 * 7. onResume()
 *    - 作用：Fragment变为活跃状态并可交互
 *    - 执行时机：onStart()之后，或其他Fragment不再活跃时
 *    - 常见操作：启动动画、初始化仅在前台使用的组件
 *    - 注意事项：此时Fragment完全可见并可交互
 * 
 * 8. onPause()
 *    - 作用：Fragment不再活跃
 *    - 执行时机：当用户离开Fragment或Fragment被部分覆盖
 *    - 常见操作：保存数据、停止动画等前台操作
 *    - 注意事项：必须快速执行完毕，不能执行耗时操作
 * 
 * 9. onStop()
 *    - 作用：Fragment完全不可见
 *    - 执行时机：Fragment被完全覆盖或宿主Activity被停止
 *    - 常见操作：释放资源、停止不必要的操作
 *    - 注意事项：此时Fragment实例仍然存在
 *
 * 10. onDestroyView()
 *    - 作用：Fragment视图被移除
 *    - 执行时机：视图不再使用时
 *    - 常见操作：清除与视图相关的资源
 *    - 注意事项：Fragment本身仍然存在，只是视图被销毁
 * 
 * 11. onDestroy()
 *    - 作用：Fragment被销毁
 *    - 执行时机：Fragment不再使用
 *    - 常见操作：释放资源
 *    - 注意事项：最终清理阶段
 *
 * 12. onDetach()
 *    - 作用：Fragment与Activity解除关联
 *    - 执行时机：Fragment被移除且不再与Activity关联
 *    - 常见操作：解除对Activity的引用
 *    - 注意事项：此后getActivity()将返回null
 *
 * 二、Fragment生命周期完整执行顺序
 *
 * 1. 添加Fragment时：
 *    onAttach() -> onCreate() -> onCreateView() -> onViewCreated() -> 
 *    onStart() -> onResume()
 *
 * 2. Fragment处于活跃状态：
 *    onResume()后Fragment处于活跃状态
 *
 * 3. 离开Fragment时（比如按返回键）：
 *    onPause() -> onStop() -> onDestroyView() -> onDestroy() -> onDetach()
 *
 * 4. 屏幕旋转或配置变更：
 *    onPause() -> onStop() -> onDestroyView() -> onDestroy() -> onDetach() -> 
 *    onAttach() -> onCreate() -> onCreateView() -> onViewCreated() -> onStart() -> onResume()
 *
 * 5. Fragment被替换但已添加到返回栈：
 *    onPause() -> onStop() -> onDestroyView()
 *    (当用户返回时：onCreateView() -> onViewCreated() -> onStart() -> onResume())
 *
 * 三、Fragment通信方式
 *
 * 1. 通过Activity
 *    - 获取宿主Activity引用，调用其方法
 *    - 适用场景：Fragment需要与宿主Activity通信
 *    - 示例：((MainActivity)getActivity()).someMethod()
 *    - 注意事项：可能产生空指针异常，应检查getActivity()是否为null
 *
 * 2. 接口回调
 *    - 在Fragment中定义接口，让Activity实现该接口
 *    - 适用场景：保持Fragment独立性，实现解耦
 *    - 示例：定义接口Callback，在onAttach()中获取实现
 *    - 注意事项：推荐方式，符合设计原则
 *
 * 3. ViewModel共享
 *    - 使用ViewModel在Fragment和Activity间共享数据
 *    - 适用场景：同一Activity中的Fragment间通信、复杂数据共享
 *    - 示例：通过ViewModelProvider(requireActivity())获取共享ViewModel
 *    - 注意事项：官方推荐方式，生命周期安全
 *
 * 4. EventBus等事件总线
 *    - 使用第三方库实现组件间通信
 *    - 适用场景：跨组件、解耦通信
 *    - 注意事项：可能导致代码难以跟踪，需谨慎使用
 *
 * 四、Fragment特有的状态保存方法
 *
 * 1. setRetainInstance(true) (已弃用)
 *    - 作用：配置变更时保留Fragment实例
 *    - 原理：Fragment实例不随Activity一起销毁重建
 *    - 适用场景：保存耗时异步操作结果，如网络请求等
 *    - 注意事项：已被废弃，推荐使用ViewModel替代
 *
 * 2. onSaveInstanceState()
 *    - 作用：保存瞬态数据
 *    - 与Activity类似，用于在系统销毁Fragment时保存数据
 *    - 适用场景：保存UI状态等轻量级数据
 *    - 注意事项：仅用于保存简单数据，复杂数据应使用ViewModel
 *
 * 五、FragmentManager
 *
 * 1. 获取FragmentManager
 *    - 在Activity中：getSupportFragmentManager()
 *    - 在Fragment中：getChildFragmentManager()（嵌套Fragment）或getParentFragmentManager()
 *
 * 2. 事务操作
 *    - add()：添加Fragment到容器中
 *    - remove()：移除Fragment
 *    - replace()：替换容器中的Fragment
 *    - hide()/show()：隐藏/显示Fragment，不影响生命周期
 *    - attach()/detach()：附加/分离Fragment，影响视图生命周期
 *    - addToBackStack()：将事务添加到返回栈
 *    - commit()：提交事务，UI线程异步执行
 *    - commitNow()：立即执行事务，UI线程同步执行
 *    - commitAllowingStateLoss()：允许在状态保存后提交，可能导致状态丢失
 *
 * 六、常见问题与面试考点
 *
 * 1. Fragment的优势是什么？
 *    答：(1) 代码重用和模块化：Fragment可在多个Activity中重复使用
 *        (2) 适应性强：便于适配不同屏幕大小设备
 *        (3) 动态界面：可动态添加、移除和替换
 *        (4) 包含自己的生命周期：独立于Activity的生命周期
 *
 * 2. Fragment相比Activity的优势和劣势？
 *    答：优势：
 *        (1) 更轻量级，可重用，可组合
 *        (2) 适合分割UI模块，尤其是平板等大屏设备
 *        劣势：
 *        (1) 生命周期复杂，容易产生问题
 *        (2) 通信机制较复杂
 *        (3) 需要小心处理状态保存和恢复
 *
 * 3. Fragment的生命周期与Activity有什么区别？
 *    答：(1) Fragment生命周期比Activity更复杂，有更多方法
 *        (2) Fragment生命周期依附于宿主Activity
 *        (3) Fragment有专门处理视图的方法：onCreateView/onDestroyView
 *        (4) Fragment有附加/分离方法：onAttach/onDetach
 *
 * 4. Fragment为什么会有内存泄漏？如何避免？
 *    答：常见原因：
 *        (1) 内部类持有外部Fragment引用
 *        (2) 静态变量持有Fragment引用
 *        (3) 异步任务引用Fragment没有正确取消
 *        避免方法：
 *        (1) 使用弱引用或ViewModel管理数据
 *        (2) 在onDestroy中取消异步任务
 *        (3) 避免静态变量持有Fragment对象
 *
 * 5. FragmentTransaction提交方式有哪几种？有什么区别？
 *    答：(1) commit()：异步提交，不立即执行
 *        (2) commitNow()：同步立即执行，不能加入返回栈
 *        (3) commitAllowingStateLoss()：允许在状态保存后提交，但可能丢失状态
 *        区别在于执行时机和对状态保存的处理不同
 *
 * 6. 嵌套Fragment的注意事项？
 *    答：(1) 子Fragment应使用getChildFragmentManager()管理
 *        (2) 父Fragment应使用getParentFragmentManager()与父级通信
 *        (3) 生命周期更复杂，父子Fragment生命周期互相影响
 *        (4) 避免嵌套过深，可能引起性能问题
 *
 * 7. Fragment如何实现懒加载？
 *    答：在ViewPager中实现懒加载：
 *        (1) 通过setUserVisibleHint()或在新版本中使用FragmentTransaction的setMaxLifecycle()
 *        (2) 配合onResume()判断Fragment对用户是否可见
 *        (3) 使用androidx.fragment 1.1.0后的新方式，结合ViewPager2和Lifecycle
 *
 * 8. 为什么不推荐使用嵌套Fragment？
 *    答：(1) 生命周期复杂，嵌套Fragment间的生命周期互相影响
 *        (2) 状态保存与恢复更容易出错
 *        (3) 可能导致性能问题
 *        (4) 事务处理容易混淆
 *
 * 9. Fragment重叠问题如何解决？
 *    答：(1) 检查是否在屏幕旋转或配置变更时重复添加了Fragment
 *        (2) 使用add/hide/show而不是replace可能导致重叠
 *        (3) 使用Fragment事务前检查是否已存在：findFragmentByTag()
 *        (4) 在Activity重建时恢复Fragment状态而不是重新添加
 *
 * 10. DialogFragment与普通Fragment的区别？
 *     答：(1) DialogFragment专为对话框设计，可作为对话框或嵌入式Fragment使用
 *         (2) DialogFragment管理自己的窗口，有额外方法如show()
 *         (3) DialogFragment自动处理屏幕旋转等配置变更
 *         (4) DialogFragment更适合创建可重用的对话框组件
 */
public class FragmentDoc {
    // 这是一个文档类，只包含注释，没有实际代码
} 